﻿#define _CRT_SECURE_NO_WARNINGS 1

//链接：https://ac.nowcoder.com/acm/problem/229023
//来源：牛客网
//
//题目描述
//𝑑
//𝑑
//dd当上了宣传委员，开始组织迎新晚会，已知班里有
//𝑛
//n个同学，每个同学有且仅有一个擅长的声部，把同学们分成恰好
//𝑚
//m组，为了不搞砸节目，每一组里的同学都必须擅长同一个声部，当然，不同组同学擅长同一个声部的情况是可以出现的，毕竟一个声部也可以分成好几个part进行表演，但是他不希望出现任何一组的人过多，否则可能会导致场地分配不协调，也就是说，她希望人数最多的小组的人尽可能少，除此之外，对组内人员分配没有其他要求，她希望你告诉她，这个值是多少，如果无法顺利安排，请输出 - 1
//输入描述:
//第一行两个数个数n, m(1≤m≤n≤100000)表示人数
//接下来一行n个数, a[i](1≤a[i]≤n)表示第i个学生的擅长声部
//输出描述 :
//输出一个数，表示人数最多的小组的人数

#include <iostream>
#include <unordered_map>
using namespace std;


int n, m;
unordered_map<int, int> cnt;//统计每种声部出现的个数

bool check(int x) //判断最多人数为x时，能否分成m组
{
    int sum = 0;//统计组数
    for (auto& [a, b] : cnt)
    {
        sum += b / x + (b % x == 0 ? 0 : 1);
    }
    return sum <= m;
}

int main()
{
    cin >> n >> m;

    int hash_max = 0;//统计人数最多的声部的人数
    int x;
    for (int i = 0; i < n; ++i)
    {
        cin >> x;
        hash_max = max(hash_max, ++cnt[x]);
    }
    int kinds = cnt.size();
    if (kinds > m)
    {
        cout << -1 << endl;
    }
    //枚举一个组中最多的人数
    else
    {
        //         for(int i=1;i<=hash_max;++i)
        //         {
        //             if(check(i))
        //             {
        //                 cout << i << endl;
        //                 break;
        //             }
        //         }
        int l = 1, r = hash_max;
        while (l < r)
        {
            int mid = (l + r) / 2;
            if (check(mid))
            {
                r = mid;
            }
            else
            {
                l = mid + 1;
            }
        }
        cout << l << endl;
    }
    return 0;
}